/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.com.s21.poo.dao;

import ar.com.s21.poo.exception.GestionarException;
import ar.com.s21.poo.model.TipoUsuario;
import ar.com.s21.poo.model.Usuario;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Other
 */
public class UsuarioDAO implements GenericDAO<Usuario> {

    /**
     *
     * @param usuario
     * @return
     * @throws SQLException
     * @throws GestionarException
     */
    @Override
    public boolean add(Usuario usuario) throws SQLException, GestionarException {

        PreparedStatement preparedStatement = null;
        boolean insertStatus = false;

        String insertUsuario = "INSERT INTO USUARIO (username, password, nombre, apellido, domicilio,tel_particular, tel_celular,fecha_registro, fecha_nacimiento,id_tipo_usuario) VALUES (?,?,?,?,?,?,?,?,?,?)";

        try {

            preparedStatement = MySQLConnection.getInstance().preparedStatement(insertUsuario);


            preparedStatement.setString(1, usuario.getUserName());
            preparedStatement.setString(2, usuario.getPassword());
            preparedStatement.setString(3, usuario.getNombre());
            preparedStatement.setString(4, usuario.getApellido());
            preparedStatement.setString(5, usuario.getDomicilio());
            preparedStatement.setString(6, usuario.getTel_particular());
            preparedStatement.setString(7, usuario.getTel_celular());
            preparedStatement.setDate(8, (Date) usuario.getFecha_registro());
            preparedStatement.setDate(9, (Date) usuario.getFecha_nacimiento());
            preparedStatement.setInt(10, usuario.getTipoUsuario().getIdTipoUsuario());


            // execute insert SQL stetement
            preparedStatement.execute();
            insertStatus = true;
            System.out.println("Record is inserted into DBUSER table!");

        } catch (SQLException e) {
            try {
                throw new GestionarException("Error al insertar cliente");
            } catch (GestionarException ex) {
                Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println(e.getMessage());

        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return insertStatus;

    }

    /**
     *
     * @param usuario
     * @throws GestionarException
     * @throws SQLException
     */
    @Override
    public void update(Usuario usuario) throws GestionarException, SQLException {
        
          PreparedStatement preparedStatement = null;
            
        String actualizarPassword = "UPDATE USUARIO set nombre=?,apellido=?,domicilio=?,activo=?,"
                + "tel_particular=?, tel_celular=?,fecha_nacimiento=?,id_tipo_usuario=? where dni=?";
        

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(actualizarPassword);
            preparedStatement.setString(1, usuario.getNombre());
            preparedStatement.setString(2, usuario.getApellido());
            preparedStatement.setString(3, usuario.getDomicilio());
            preparedStatement.setBoolean(4, usuario.isActivo());
            preparedStatement.setString(5, usuario.getTel_particular());
            preparedStatement.setString(6, usuario.getTel_celular());
            preparedStatement.setDate(7, (Date) usuario.getFecha_nacimiento());
            preparedStatement.setInt(8, usuario.getTipoUsuario().getIdTipoUsuario());
            preparedStatement.setString(9, usuario.getDni());
            
            preparedStatement.executeUpdate();
                     
        } catch (SQLException e) {

            System.out.println(e.getMessage());
            

        } finally {

            if (preparedStatement != null) {
                
                    preparedStatement.close();
            }
        }
        
    }

    /**
     *
     * @param usuario
     * @return
     */
    @Override
    public boolean delete(Usuario usuario) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    /**
     *
     * @param userName
     * @param password
     * @param tipoUsuario
     * @throws SQLException
     * @throws GestionarException
     */
    public void validarUsuario(String userName, String password, String tipoUsuario)
            throws SQLException, GestionarException {

        PreparedStatement preparedStatement = null;
        String sqlValidarUsuario = "SELECT * FROM usuario u, tipousuario tu WHERE "
                + "u.id_tipo_usuario=tu.id_tipo_usuario and u.username=? and u.password=? and tu.tipo_usuario=?";

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(sqlValidarUsuario);
            preparedStatement.setString(1, userName);
            preparedStatement.setString(2, password);
            preparedStatement.setString(3, tipoUsuario);

            ResultSet result = preparedStatement.executeQuery();
            boolean existe = result.next();

            if (!existe) {
                throw new GestionarException("Datos Incorrectos: Revise su usuario, pass o rol de ingreso");
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
    }

    /**
     *
     * @return
     * @throws SQLException
     */
    public List<Usuario> listarVendedores() throws SQLException {
        PreparedStatement preparedStatement = null;
        List<Usuario> lstVendedores = new ArrayList<Usuario>();
        Usuario vendedor = null;

    
        String buscarUsuarioVendedorSQL = "SELECT * FROM usuario u where u.id_tipo_usuario=2 and activo=true";

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(buscarUsuarioVendedorSQL);

            ResultSet result = preparedStatement.executeQuery();
//            boolean existe = result.next();

            
            while(result.next()){
                vendedor = new Usuario();
                vendedor.setNombre(result.getString("nombre"));
                vendedor.setApellido(result.getString("apellido"));
                vendedor.setIdUsuario(result.getInt("id_usuario"));
                lstVendedores.add(vendedor);
              }
            
        } catch (SQLException e) {

            System.out.println(e.getMessage());
            
        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return lstVendedores;


    }
    
    
    
    /**
     *
     * @return
     * @throws SQLException
     */
    public List<Usuario> listarClientes() throws SQLException {
        PreparedStatement preparedStatement = null;
        List<Usuario> lstClientes;
        lstClientes = new ArrayList<>();
        Usuario cliente;

    
        String buscarUsuarioClientesSQL = "SELECT * FROM usuario where id_tipo_usuario=1 and activo=true";

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(buscarUsuarioClientesSQL);

            ResultSet result = preparedStatement.executeQuery();
//            boolean existe = result.next();

            
            while(result.next()){
                cliente = new Usuario();
                cliente.setNombre(result.getString("nombre"));
                cliente.setApellido(result.getString("apellido"));
                cliente.setIdUsuario(result.getInt("id_usuario"));
                lstClientes.add(cliente);
              }
            
        } catch (SQLException e) {

            System.out.println(e.getMessage());
            
        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return lstClientes;


    }

    /**
     *
     * @param nombreUsuario
     * @param tipoUsuario
     * @return
     * @throws GestionarException
     * @throws SQLException
     */
    public boolean existeNombreUsuario(String nombreUsuario, String tipoUsuario) throws GestionarException, SQLException {
        PreparedStatement preparedStatement = null;
        boolean existe= false;
            
        String existeUsuarioQuery = "SELECT * FROM usuario u, tipoUsuario tu where u.id_tipo_usuario=tu.id_tipo_usuario and u.username=? and tu.tipo_usuario=? ";
        

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(existeUsuarioQuery);
            preparedStatement.setString(1, nombreUsuario);
            preparedStatement.setString(2, tipoUsuario);

            ResultSet result = preparedStatement.executeQuery();
           
            while(result.next()){
                existe = true;
                
              }
            
        } catch (SQLException e) {

            System.out.println(e.getMessage());
            throw new GestionarException("Eror de base de datos no esperado");

        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return existe;

    }
    
    
    /**
     *
     * @param dni
     * @return
     * @throws GestionarException
     */
    public Usuario buscarPorDNI(String dni) throws GestionarException{
        PreparedStatement preparedStatement = null;
        Usuario usuario = null;
        
            
        String existeUsuarioQuery = "SELECT * FROM usuario u, tipoUsuario tu where u.id_tipo_usuario=tu.id_tipo_usuario and u.dni=?";
        

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(existeUsuarioQuery);
            preparedStatement.setString(1, dni);
            
            ResultSet result = preparedStatement.executeQuery();
           
            while(result.next()){
                usuario = new Usuario();
                
                usuario.setNombre(result.getString("nombre"));
                usuario.setApellido(result.getString("apellido"));
                usuario.setDomicilio(result.getString("domicilio"));
                usuario.setFecha_nacimiento(result.getDate("fecha_nacimiento"));
                usuario.setFecha_registro(result.getDate("fecha_registro"));
                usuario.setDni(dni);
                usuario.setUserName(result.getString("username"));
                usuario.setPassword(result.getString("password"));
                usuario.setTel_celular(result.getString("tel_celular"));
                usuario.setTel_particular(result.getString("tel_particular"));
                usuario.setActivo(result.getBoolean("activo"));
                TipoUsuario tipoUsuario = new TipoUsuario();
                tipoUsuario.setIdTipoUsuario(result.getInt("id_tipo_usuario"));
                tipoUsuario.setTipoUsuario(result.getString("tipo_usuario"));
                usuario.setTipoUsuario(tipoUsuario);
            }
            
            if(usuario == null){
                throw new GestionarException("El usuario no corresponde al DNI especificado");
            }
            
            
            
        } catch (SQLException e) {

            System.out.println(e.getMessage());
            

        } finally {

            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException ex) {
                    Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        return usuario;

    }

    /**
     *
     * @param usuario
     * @param tipoUsuario
     * @param password
     * @param passwordrepetido
     * @throws GestionarException
     */
    public void actualizarPassword(String usuario, String tipoUsuario, String password, String passwordrepetido) throws GestionarException {
        
        PreparedStatement preparedStatement = null;
        
        
            
        String actualizarPassword = "UPDATE USUARIO set password=? where username=?";
        

        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(actualizarPassword);
            preparedStatement.setString(1, password);
            preparedStatement.setString(2, usuario);
            
            int result = preparedStatement.executeUpdate();
            
            if(result==2){
                throw new GestionarException("El usuario no existe");
            }
            
        } catch (SQLException e) {

            System.out.println(e.getMessage());
            

        } finally {

            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException ex) {
                    Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
        
    }

    /**
     *
     * @param nombre
     * @param apellido
     * @return
     * @throws SQLException
     */
    public Usuario getClientePorNombreYApellido(String nombre, String apellido) throws SQLException {
                
        PreparedStatement preparedStatement = null;
        String buscarUsuarioSQL = "SELECT * FROM usuario where nombre=? and apellido=? and id_tipo_usuario=1";
        Usuario u = null;
        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(buscarUsuarioSQL);

            preparedStatement.setString(1, nombre);
            preparedStatement.setString(2, apellido);
           
            ResultSet result = preparedStatement.executeQuery();
            
            while(result.next()){
                u = new Usuario();
                u.setIdUsuario(result.getInt("id_usuario"));
            }
                                 
        } catch (SQLException e) {

            System.out.println(e.getMessage());

        } finally {
            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return u;


    }
        
    /**
     *
     * @param nombre
     * @param apellido
     * @return
     * @throws SQLException
     */
    public Usuario getVendedorPorNombreYApellido(String nombre, String apellido) throws SQLException {
                
        PreparedStatement preparedStatement = null;
        String buscarUsuarioSQL = "SELECT * FROM usuario u where u.nombre=? and u.apellido=? and u.id_tipo_usuario=2";
        Usuario u = null;
        try {
            preparedStatement = MySQLConnection.getInstance().preparedStatement(buscarUsuarioSQL);

            preparedStatement.setString(1, nombre);
            preparedStatement.setString(2, apellido);
           
            ResultSet result = preparedStatement.executeQuery();
            
            while(result.next()){
                u = new Usuario();
                u.setIdUsuario(result.getInt("id_usuario"));
            }
                                 
        } catch (SQLException e) {

            System.out.println(e.getMessage());

        } finally {
            if (preparedStatement != null) {
                preparedStatement.close();
            }
        }
        return u;


    }   
    

   
    
    
    
    
    
    
    
    
    
    
    
        
}
